/*
 * Conducteur.cpp
 *
 *  Created on: 16 mars 2011
 *      Author: Julien
 */

#include "Conducteur.h"
#include "Rame.h"
#include "defines.h"

void ajouterThread(pthread_t thread, int type_thread);

//bool demarrer = false; //Variable globale ; TODO pas très élégant, essayer de trouver une autre solution

Conducteur::Conducteur(Rame* rame) {


	// On bloque tous les signaux
	sigset_t set;
	sigfillset(&set);
	pthread_sigmask( SIG_BLOCK, & set, NULL );

	/*// On associe le signal SIGUSR1 à son handler
	struct sigaction sa;
	sa.sa_handler = receptionSignalDemarrer;
	sigaction(SIGUSR1, &sa, 0);

	// On associe le signal SIGUSR2à son handler
	struct sigaction sa2;
	sa2.sa_handler = receptionSignalArreter;
	sigaction(SIGUSR2, &sa2, 0);
*/
	cout << "Conducteur : Signaux bloqués." <<endl;

	this->rame = rame;

}

void Conducteur::demarrerThread(){
	if (pthread_create(&thread, 0, Conducteur::threadConducteur, this) != 0) {
		cout << "/!\\ Echec dans fonction Conducteur::demarrerThread. /!\\"
				<< endl;
	} else {
		cout << "Thread Conducteur créé" << endl;
	}
	ajouterThread(thread,CONDUCTEUR);
}

void * Conducteur::threadConducteur(void* param){
	// On recupere le pointeur sur le conducteur passe en parametre de creation du thread
	Conducteur * cond = reinterpret_cast<Conducteur*>(param);

	sigset_t signal;
	int sigIntercepte;

	// On s'assure que le masque de signaux est vide
	if(sigemptyset(&signal) == -1) {
		perror("Erreur sigemptyset");
	}

	// On ajoute le signal SIGUSR1 au masque
	if(sigaddset(&signal, SIGUSR1) == -1) {
		perror("Erreur sigaddset");
	}
	// On ajoute le signal SIGUSR2 au masque
	if(sigaddset(&signal, SIGUSR2) == -1) {
		perror("Erreur sigaddset");
	}
	while(1) {
		//On attend un signal
		sigwait(&signal, &sigIntercepte);
		if(sigIntercepte == SIGUSR1) {
			cout << "Conducteur : réception signal de départ" << endl;
			cond->deplacerTram();
		} else if (sigIntercepte == SIGUSR2) {
				cout << "Conducteur : reception signal d'arrêt" << endl;
				cond->arreterTram();
		}
    }
	return 0;
}

void Conducteur::afficher(){
	cout << "Bonjour je m'appelle Bernard Berchonneau, je vais conduire la rame." << endl;
	cout << "(Toute ressemblance avec un personnage existant ou ayant existé est bien entendu fortuite.)" << endl;
}

void Conducteur::arreterThread(){
	//pthread_close();
}

void Conducteur::deplacerTram(){
	// TODO A verifier
	this->rame->getTraction()->avancer();
}

void Conducteur::arreterTram(){
	// TODO A verifier
	this->rame->getTraction()->stopper();
}

Conducteur::~Conducteur() {
	// TODO Auto-generated destructor stub
}
